package com.alibaba.dubbo.wrapper;


import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.ProxyFactory;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcInvocation;
import com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory;


/**
 *
 *  Dubbo 服务提供者 Invoker执行器原理
 *
 * @author zhangjuntao
 * @create 2017-10-27 下午2:26
 **/
public class WrapperStart {
    public static void main(String[] args) {
        final ProxyFactory proxyFactory = new JavassistProxyFactory();
        WrapperService invocation = msg -> msg.toUpperCase();

        /**
         *
         * 1、生成Invoker
         *      加载 Dubbo Service字节码 wrapper 包装类，并返回调用该 Wrapper的执行器 invoker。
         */
        Invoker<WrapperService> invoker = proxyFactory.getInvoker(invocation, WrapperService.class, null);


        /**
         *
         * 2、执行Invoker    invoke() -> doInvoke()
         *      Dubbo Service 实例传入doInvoke,并利用wrapper 包装类匹配得到将要执行Service方法。
         */
        Result result = invoker.invoke(new RpcInvocation("echo", new Class[]{String.class}, new Object[]{"zhang"}));
        result.getAttachments().forEach((k, v) -> System.out.println(String.format("k:%s\tv:%s", k, v)));
        System.out.println(result.getValue());
        System.out.println(result.getException());
    }
}
